package com.smart.community.property.controller;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.smart.community.feign.property.dto.PropertyCompanyPaymentInfoDTO;
import com.smart.community.feign.region.service.IRegionHierarchyFeign;
import com.smart.community.property.service.IPropertyCompanyPaymentService;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;

/**
 * 物业公司支付Feign接口实现Controller
 * 
 * 实现物业公司支付相关的Feign接口，为缴费系统提供收款码获取等功能
 * 业务流程：房户ID → 物业公司ID → 收款码信息
 * 
 * @author Wu.Liang
 * @version 2.0.0
 * @since 2025-01-30
 */
@Slf4j
@RestController
@RequestMapping("/property/company-payment")
@Tag(name = "物业公司支付Feign接口", description = "物业公司支付相关Feign接口，支持收款码获取等功能")
public class PropertyCompanyPaymentFeignController {

    @Autowired
    private IPropertyCompanyPaymentService propertyCompanyPaymentService;
    
    @Autowired
    private IRegionHierarchyFeign regionHierarchyFeign;

    /**
     * 根据物业公司ID获取收款码信息
     * 
     * 核心支付接口：通过物业公司ID获取收款二维码、支付账户等信息
     * 用于缴费系统展示收款码，支持扫码支付
     * 
     * @param propertyCompanyId 物业公司ID
     * @return 物业公司支付信息，包含收款码、支付账户等
     * @throws Exception 当获取支付信息失败时抛出异常
     */
    @GetMapping("/feign/property-company/{propertyCompanyId}/payment-info")
    @Operation(summary = "根据物业公司ID获取收款码信息", description = "缴费系统核心接口，获取物业公司收款码和支付信息")
    public PropertyCompanyPaymentInfoDTO getPropertyCompanyPaymentInfo(
            @Parameter(description = "物业公司ID") @PathVariable("propertyCompanyId") Long propertyCompanyId) throws Exception {
        
        log.info("Feign接口：根据物业公司ID获取收款码信息，物业公司ID: {}", propertyCompanyId);
        
        PropertyCompanyPaymentInfoDTO paymentInfo = propertyCompanyPaymentService.getPropertyCompanyPaymentInfo(propertyCompanyId);
        log.info("Feign接口：成功获取物业公司收款码信息，物业公司ID: {}, 公司名称: {}", propertyCompanyId, paymentInfo.getCompanyName());
        
        return paymentInfo;
    }
    
    /**
     * 根据房户ID获取收款码信息
     * 
     * 便捷接口：通过房户ID直接获取对应的物业公司收款码信息
     * 内部调用区域层级关系Feign接口获取物业公司ID，再获取收款码信息
     * 
     * @param householdId 房户ID
     * @return 物业公司支付信息，包含收款码、支付账户等
     * @throws Exception 当获取支付信息失败时抛出异常
     */
    @GetMapping("/feign/household/{householdId}/payment-info")
    @Operation(summary = "根据房户ID获取收款码信息", description = "便捷接口，通过房户ID直接获取物业公司收款码信息")
    public PropertyCompanyPaymentInfoDTO getPaymentInfoByHouseholdId(
            @Parameter(description = "房户ID") @PathVariable("householdId") Long householdId) throws Exception {
        
        log.info("Feign接口：根据房户ID获取收款码信息，房户ID: {}", householdId);
        
        // 第1步：通过区域层级关系Feign接口获取物业公司ID
        Long propertyCompanyId = regionHierarchyFeign.getPropertyCompanyIdByHouseholdId(householdId);
        if (propertyCompanyId == null) {
            log.warn("Feign接口：房户未关联物业公司，房户ID: {}", householdId);
            return createDefaultPaymentInfo(null);
        }
        
        // 第2步：根据物业公司ID获取收款码信息
        PropertyCompanyPaymentInfoDTO paymentInfo = propertyCompanyPaymentService.getPropertyCompanyPaymentInfo(propertyCompanyId);
        log.info("Feign接口：成功根据房户ID获取收款码信息，房户ID: {}, 物业公司ID: {}, 公司名称: {}", 
                householdId, propertyCompanyId, paymentInfo.getCompanyName());
        
        return paymentInfo;
    }
    
    /**
     * 批量根据物业公司ID获取收款码信息
     * 
     * 用于批量缴费、批量查询等场景，提高查询效率
     * 
     * @param propertyCompanyIds 物业公司ID列表
     * @return 物业公司ID与支付信息的映射关系
     * @throws Exception 当批量获取支付信息失败时抛出异常
     */
    @PostMapping("/feign/property-companies/payment-info")
    @Operation(summary = "批量根据物业公司ID获取收款码信息", description = "批量获取物业公司收款码信息，提高查询效率")
    public Map<Long, PropertyCompanyPaymentInfoDTO> getPropertyCompanyPaymentInfoBatch(
            @Parameter(description = "物业公司ID列表") @RequestBody List<Long> propertyCompanyIds) throws Exception {
        
        log.info("Feign接口：批量获取物业公司收款码信息，物业公司ID数量: {}", propertyCompanyIds.size());
        
        Map<Long, PropertyCompanyPaymentInfoDTO> paymentInfoMap = propertyCompanyPaymentService.getPropertyCompanyPaymentInfoBatch(propertyCompanyIds);
        log.info("Feign接口：成功批量获取物业公司收款码信息，物业公司ID数量: {}, 成功获取数量: {}", 
                propertyCompanyIds.size(), paymentInfoMap.size());
        
        return paymentInfoMap;
    }
    
    /**
     * 创建默认的支付信息
     * 
     * @param propertyCompanyId 物业公司ID
     * @return 默认支付信息
     */
    private PropertyCompanyPaymentInfoDTO createDefaultPaymentInfo(Long propertyCompanyId) {
        PropertyCompanyPaymentInfoDTO defaultInfo = new PropertyCompanyPaymentInfoDTO();
        defaultInfo.setPropertyCompanyId(propertyCompanyId);
        defaultInfo.setCompanyName("物业公司");
        defaultInfo.setCompanyCode("DEFAULT");
        defaultInfo.setOnlinePaymentEnabled(false);
        defaultInfo.setQrCodePaymentEnabled(false);
        defaultInfo.setPaymentDescription("支付服务暂时不可用，请联系物业公司");
        return defaultInfo;
    }
}
